perm filename PIX.SAI[PIX,HPM]23 blob
sn#228691 filedate 1976-08-01 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00039 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00006 00002 BEGIN "PIX"
C00009 00003 IF CHR="?" THEN
C00012 00004 IF CHR="T" THEN comment take a picture via a camera
C00014 00005 IF CHR="↑" THEN comment optimize clip levels
C00019 00006 IF CHR='175 THEN comment alter camera number
C00020 00007 IF CHR="B" THEN comment alter bits/pixel, size and # to average
C00022 00008 IF CHR="I" THEN comment input a file
C00024 00009 IF CHR="%" THEN comment give information about a file
C00027 00010 IF CHR="/" THEN comment input a portion of a file
C00030 00011 IF CHR="O" THEN comment output a file
C00031 00012 IF CHR="D" THEN comment video synthesizer display
C00035 00013 IF CHR="H" THEN comment high quality halftone
C00039 00014 IF CHR="R" THEN comment random halftone
C00041 00015 IF CHR="A" THEN comment arty bug halftone
C00043 00016 IF CHR="X" THEN comment send previous halftone to the XGP
C00044 00017 IF CHR="#" THEN comment switch a video switch output
C00045 00018 IF CHR="P" THEN comment list a picture on the tty
C00048 00019 IF CHR="∂" THEN comment add a letter to a font
C00050 00020 IF CHR="λ" THEN comment make an XGPable file
C00052 00021 IF CHR="C" THEN comment step past a certain number of pictures
C00053 00022 IF CHR="K" THEN comment clear the video synthesizer
C00054 00023 IF CHR="*" THEN comment gronk synthesizer intensity table
C00056 00024 IF CHR="S" THEN comment change size of displays
C00063 00025 IF CHR="F" THEN comment high pass filter
C00064 00026 IF CHR="L" THEN comment low pass filter
C00065 00027 IF CHR="W" THEN comment select a window
C00068 00028 IF CHR="Z" THEN comment change size of a picture
C00070 00029 IF CHR="U" THEN comment remove blank border from a picture
C00073 00030 IF CHR="N" THEN comment apply noise remover
C00074 00031 IF CHR="V" THEN comment apply interest operator
C00075 00032 IF CHR="M" THEN comment pixel modification
C00077 00033 IF CHR="G" THEN comment graph a histogram
C00080 00034 IF CHR="J" THEN comment graph a histogram
C00083 00035 IF CHR="E" THEN comment apply histogram normalizer
C00086 00036 IF CHR="Y" THEN comment apply vert sync loss correction
C00087 00037 IF CHR="Q" THEN comment exit
C00088 00038 BEGIN comment an unrecognized character
C00090 00039 END
C00093 ENDMK
C⊗;
BEGIN "PIX"
REQUIRE "VIXHDR.SAI[VIS,HPM]" SOURCE_FILE;
require "outdd.rel[s,pmf]" load_module;
external procedure outdd(string s; INTEGER SPOS(2), PPOS(-1));
INTEGER CAMERA,CHR,HIG,WID,BITS,PWANT,PHAVE,PDEFAULT;
STRING BACKLOG; REAL SSIZE,HSIZE,SASPECT,HASPECT;
INTEGER SDISWID,SDISHIG,SYPOS; REAL MAPTF; INTEGER MAPBT;
INTEGER HDISWID,HDISHIG,HAPOS;
BOOLEAN INITED,SYNLAS,HAFTONE;
INTEGER BCL,TCL,SUMS,XEE,YEE,NRTRY;
boolean outddcalled;
REAL TASPECT,TLEN,TWID;
REAL LXB,LYB,UXB,UYB;
INTEGER PROCEDURE UCONV(INTEGER I);
RETURN(IF I>'140 ∧ I≤'172 THEN I LAND '137 ELSE I);
LXB←LYB←-1; UXB←UYB←1;
BCL←7; TCL←0;
YEE←0; XEE←1;
CAMERA←'54; BACKLOG←""; INITED←FALSE; SYNLAS←TRUE; HAFTONE←FALSE;
HIG←260; WID←288; BITS←4; SUMS←1;
PDEFAULT←PWANT←PHAVE←PIXDIM(HIG,WID,BITS);
TASPECT←6/10; TLEN←60; TWID←60; NRTRY←100;
SSIZE←HSIZE←.5; SASPECT←HASPECT←260/288; MAPTF←.4; MAPBT←4;
SDISWID←HDISWID←SDISHIG←HDISHIG←1; HAPOS←SYPOS←1;
DDINIT; SCREEN(-1,-1,1,1);
synmap(0,-1);
outddcalled←false;
OUTSTR("TYPE ? FOR HELP"&'15&'12);
WHILE TRUE DO
BEGIN
INTEGER ARRAY PIC[0:PHAVE];
IF PHAVE=PDEFAULT THEN
BEGIN
MAKPIX(HIG,WID,BITS,PIC[0]);
INITED←TRUE;
END;
WHILE PHAVE=PWANT DO
BEGIN
MAPBT←MAPBT MAX PIC[BYBI];
IF LENGTH(BACKLOG)=0 THEN
BEGIN
OUTSTR("*");
DO CHR←UCONV(INCHRW) UNTIL CHR≠'15;
END
ELSE CHR←UCONV(LOP(BACKLOG));
IF CHR="?" THEN
BEGIN
outddcalled←true;
OUTdd(" Pix Commands
""T"" take a picture from currently selected source
""↑"" optimize digitizer clip levels. default= 7,0
<altmode> set video source. default=44, the new cart reciever
""B"" set digitizer window, bits/sample, no of frames to average
""I"", ""O"" input or output pictures from or to a file
""%"", ""/"" for very large files. % gets dimensions, / reads in a part
""D"" display the current picture on the video synthesizer
""H"", ""R"" or ""A"" display it as a halftone (H good, R random, A arty)
""P"" print it out as a character display (halftone) on the terminal
""λ"" make a file suitable for XGPing in one of the halftone fonts
""∂"" insert the last data disc display in a font file
""X"" output the most recent data disc display on the XGP
""S"" set multiplicity, shape and size of displays. default=1x1, 1/2 size
""C"" skip past a number of slots (when displaying multiple pictures)
""K"" clear the video synthesizer
""*"" adjust the video intensity table
""#"" connect a foreign video switch line to a given channel
""Z"" change the height, width and bits/pixel of the picture
""W"" select a window from the picture
""U"" unborder the picture (remove any blank black border)
""Y"" fix a picture with lost vertical sync (rolled in the y direction)
""F"", ""L"", ""N"" or ""V"" filter the picture
F high pass, L low pass (halve resolution), N remove noise, V interest
""G"" or ""J"" graph the numbers of each grey level. G raw, J integrated
""E"" enhance a picture (normalize the instances of each grey level)
""M"" modify grey levels via a function (entered piecewise linear)
""Q"" quit");
OUTSTR('15&'12);
END
ELSE
IF CHR="T" THEN comment take a picture via a camera;
BEGIN
INTEGER NRT;
IF PHAVE=PDEFAULT THEN
BEGIN
IF ¬INITED THEN
BEGIN
MAKPIX(HIG,WID,BITS,PIC[0]);
INITED←TRUE;
END;
NRT←CAMPIX(CAMERA,YEE,XEE,PIC[0],SUMS,BCL,TCL,NRTRY);
OUTSTR(" "&(IF NRT<0 THEN " aborted" ELSE
CVS(NRT)&" RETR"&(IF NRT≠1 THEN "IES" ELSE "Y"))&'15&'12);
IF NRT≥0 THEN
OUTSTR(CVS(PIC[PCLN])&" LINES x "&CVS(PIC[LNBY])&
" BYTES/LINE x "&CVS(PIC[BYBI])&" BITS/BYTE"&'15&'12);
END
ELSE
BEGIN
BACKLOG←"T";
PWANT←PDEFAULT;
END;
END
ELSE
IF CHR="↑" THEN comment optimize clip levels;
BEGIN
STRING SIN; INTEGER FOO;
OUTSTR("<CR> FOR AUTO OR TCLIP, BCLIP (0≤TCLIP≤BCLIP≤7):"); SIN←INCHWL;
IF LENGTH(SIN)≠0 THEN
BEGIN
TCL←INTSCAN(SIN,FOO);
BCL←INTSCAN(SIN,FOO);
END
ELSE
BEGIN
INTEGER ARRAY T[0:PIXDIM(HIG,WID,4)];
INTEGER NRT;
MAKPIX(HIG,WID,4,T[0]);
NRT←CAMPIX(CAMERA,YEE,XEE,T[0],1,BCL←7,TCL←0,NRTRY);
OUTSTR(" "&(IF NRT<0 THEN " aborted" ELSE
CVS(NRT)&" RETR"&(IF NRT≠1 THEN "IES" ELSE "Y"))&'15&'12);
IF NRT≥0 THEN
BEGIN
INTEGER ARRAY TT[0:15];
INTEGER I,S,P;
HISTOG(T[0],TT[0]);
S←0;
FOR I←0 STEP 1 UNTIL 7 DO S←S+(TT[I]←TT[2*I]+TT[2*I+1]);
TCL←0; P←0; WHILE (P←P+TT[7-TCL])<S%12 DO TCL←TCL+1;
BCL←7; P←0; WHILE (P←P+TT[7-BCL])<S%12 DO BCL←BCL-1;
OUTSTR("TCLIP="&CVS(TCL)&" BCLIP="&CVS(BCL)&'15&'12);
END;
END;
END
ELSE
IF CHR='175 THEN comment alter camera number;
BEGIN
OUTSTR(" CHANNEL NUMBER:");
CAMERA←CVO(INCHWL);
BCL←7; TCL←0;
END
ELSE
IF CHR="B" THEN comment alter bits/pixel, size and # to average;
BEGIN
INTEGER T,FOO; STRING INST;
OUTSTR(" PICTURE HEIGHT, WIDTH (NOW "&CVS(HIG)&", "&CVS(WID)&"):");
INST←INCHWL;
IF LENGTH(INST)>2 THEN
BEGIN
HIG←INTSCAN(INST,FOO); WID←INTSCAN(INST,FOO);
END;
OUTSTR(" PICTURE YEDGE, XEDGE (NOW "&CVS(YEE%2)&", "&CVS(XEE)&"):");
INST←INCHWL;
IF LENGTH(INST)>2 THEN
BEGIN
YEE←2*INTSCAN(INST,FOO); XEE←INTSCAN(INST,FOO) MAX 1;
END;
OUTSTR(" NO. OF PICTURES TO AVERAGE (NOW "&CVS(SUMS)&"):");
T←CVD(INCHWL); IF T>0 THEN SUMS←T;
OUTSTR(" BITS/PIXEL (NOW "&CVS(BITS)&"):");
T←CVD(INCHWL); IF T>0 THEN BITS←T MIN 36;
OUTSTR(" SUPPRESS PARTIAL RETRIES?");
NRTRY←(IF (INCHWL LAND '137)="Y" THEN -200 ELSE 100);
PDEFAULT←PWANT←PIXDIM(HIG,WID,BITS);
END
ELSE
IF CHR="I" THEN comment input a file;
BEGIN
STRING FN;
IF LENGTH(BACKLOG)=0 THEN
BEGIN
OUTSTR("FILE:");
IF LENGTH(FN←INCHWL)>0 ∧ PFLDIM(FN)>0 THEN
BEGIN
PWANT←PFLDIM(FN);
BACKLOG←"I"&FN;
END ELSE OUTSTR("aborted"&'15&'12);
END
ELSE
BEGIN
GETPFL(BACKLOG,PIC[0]);
OUTSTR(CVS(PIC[PCLN])&" LINES x "&CVS(PIC[LNBY])&
" BYTES/LINE x "&CVS(PIC[BYBI])&" BITS/BYTE"&'15&'12);
BACKLOG←"";
INITED←FALSE;
END;
END
ELSE
IF CHR="%" THEN comment give information about a file;
BEGIN
STRING FN;
OUTSTR("FILE:");
IF LENGTH(FN←INCHWL)>0 ∧ PFLDIM(FN)>0 THEN
BEGIN
INTEGER ARRAY HD[0:10];
GETPFD(FN,HD[0]);
OUTSTR(CVS(HD[PCLN])&" LINES x "&CVS(HD[LNBY])&
" BYTES/LINE x "&CVS(HD[BYBI])&" BITS/BYTE"&'15&'12);
END ELSE OUTSTR("aborted"&'15&'12);
END
ELSE
IF CHR="/" THEN comment input a portion of a file;
BEGIN
STRING FN,INFL; OWN INTEGER LY,LX,HY,HX,CMP,BT;
INTEGER FOO;
IF LENGTH(BACKLOG)=0 THEN
BEGIN
OUTSTR("FILE:");
IF LENGTH(FN←INCHWL)>0 ∧ PFLDIM(FN)>0 THEN
BEGIN
INTEGER ARRAY HD[0:10];
GETPFD(FN,HD[0]);
OUTSTR(CVS(HD[PCLN])&" LINES x "&CVS(HD[LNBY])&
" BYTES/LINE x "&CVS(HD[BYBI])&" BITS/BYTE"&'15&'12);
BACKLOG←"/"&FN;
OUTSTR("LOW Y, LOW X (IN PIXELS):"); INFL←INCHWL;
LY←INTSCAN(INFL,FOO); LX←INTSCAN(INFL,FOO);
LY←(LY MAX 0) MIN (HD[PCLN]-1); LX←(LX MAX 0) MIN (HD[LNBY]-1);
OUTSTR("LINEAR COMPRESSION FACTOR:"); INFL←INCHWL;
CMP←INTSCAN(INFL,FOO);
CMP←CMP MAX 1;
OUTSTR("HEIGHT, WIDTH AND BITS/PIXEL OF RESULT:"); INFL←INCHWL;
HY←INTSCAN(INFL,FOO); HX←INTSCAN(INFL,FOO);
IF HY=0 THEN HY←256; IF HX=0 THEN HX←256;
HY←(HY MAX 1) MIN (HD[PCLN]-LY)%CMP;
HX←(HX MAX 1) MIN (HD[LNBY]-LX)%CMP;
BT←INTSCAN(INFL,FOO); IF BT=0 THEN BT←HD[BYBI];
BT←(BT MAX 1) MIN 36;
PWANT←PIXDIM(HY,HX,BT);
END ELSE OUTSTR("aborted"&'15&'12);
END
ELSE
BEGIN
MAKPIX(HY,HX,BT,PIC[0]);
GETPFP(BACKLOG,PIC[0],LY,LX,CMP,CMP);
OUTSTR(CVS(PIC[PCLN])&" LINES x "&CVS(PIC[LNBY])&
" BYTES/LINE x "&CVS(PIC[BYBI])&" BITS/BYTE"&'15&'12);
BACKLOG←"";
INITED←FALSE;
END;
END
ELSE
IF CHR="O" THEN comment output a file;
BEGIN
STRING FN;
OUTSTR("FILE:");
IF LENGTH(FN←INCHWL)≠0 THEN PUTPFL(PIC[0],FN)
ELSE OUTSTR("aborted"&'15&'12);
END
ELSE
IF CHR="D" THEN comment video synthesizer display;
BEGIN
INTEGER I,J;
REAL SX,SY,ASP,ASPEN;
REAL PX,PY; INTEGER MODP;
SYNLAS←TRUE;
MODP←SYPOS MOD (SDISWID*SDISHIG);
PX←MODP MOD SDISWID;
MODP←MODP%SDISWID;
PY←SDISHIG-MODP-1;
PX←2*PX-SDISWID+1;
PY←2*PY-SDISHIG+1;
SX←1; SY←1; ASPEN←SASPECT*SDISWID/SDISHIG;
ASP←PIC[PCLN]/PIC[LNBY];
IF ASP>ASPEN THEN SX←ASPEN/ASP ELSE SY←ASP/ASPEN;
SX←SX*SSIZE; SY←SY*SSIZE;
SETFORMAT(0,2);
SCREEN(-SDISWID,-SDISHIG,SDISWID,SDISHIG);
MAPGRY(MAPTF,MAPBT); GRAY(PIC[0]);
I←PIC[BYBI];
IF SYNMAP(I)>0 ∨ SDISHIG*SDISWID>1 THEN
BEGIN
IF SDISHIG*SDISWID>1 THEN GETDDF("DD"&CVS(I)&".TMP[TMP,HPM]");
DRKEN; RECTAN(PX-1,PY-1,PX+1,PY+1);
VID(LXB←PX-SX,LYB←PY-SY,UXB←PX+SX,UYB←PY+SY,PIC[0],1);
IF SYNMAP(I)>0 THEN
BEGIN
ERASE(SYNMAP(I));
FOR J←1,1,1 DO DPYUP(SYNMAP(I));
END;
SHOWA('47);
IF SDISHIG*SDISWID>1 THEN PUTDDF("DD"&CVS(I)&".TMP[TMP,HPM]");
END;
FOR I←PIC[BYBI]-1 STEP -1 UNTIL 0 DO
IF SYNMAP(I)>0 ∨ SDISHIG*SDISWID>1 THEN
BEGIN
IF SDISHIG*SDISWID>1 THEN GETDDF("DD"&CVS(I)&".TMP[TMP,HPM]");
DRKEN; RECTAN(PX-1,PY-1,PX+1,PY+1);
VID(LXB←PX-SX,LYB←PY-SY,UXB←PX+SX,UYB←PY+SY,
PIC[0],1 LSH (PIC[BYBI]-1-I));
IF SYNMAP(I)>0 THEN
BEGIN
ERASE(SYNMAP(I));
FOR J←1,1,1 DO DPYUP(SYNMAP(I));
END;
SHOWA('47);
IF SDISHIG*SDISWID>1 THEN PUTDDF("DD"&CVS(I)&".TMP[TMP,HPM]");
END;
UNGRAY(PIC[0]);
HAFTONE←TRUE;
SYPOS←SYPOS+1;
OUTSTR('15&'12&"*");
SHOW('47);
DO BACKLOG←INCHRW UNTIL BACKLOG≠'15∧BACKLOG≠'12;
SHOW(-1);
END
ELSE
IF CHR="H" THEN comment high quality halftone;
BEGIN
INTEGER J,CHN;
REAL SX,SY,ASP,ASPEN;
REAL PX,PY; INTEGER MODP;
SYNLAS←FALSE;
MODP←HAPOS MOD (HDISWID*HDISHIG);
PX←MODP MOD HDISWID;
MODP←MODP%HDISWID;
PY←HDISHIG-MODP-1;
PX←2*PX-HDISWID+1;
PY←2*PY-HDISHIG+1;
SX←1; SY←1; ASPEN←HASPECT*HDISWID/HDISHIG;
ASP←PIC[PCLN]/PIC[LNBY];
IF ASP>ASPEN THEN SX←ASPEN/ASP ELSE SY←ASP/ASPEN;
SX←SX*HSIZE; SY←SY*HSIZE;
SCREEN(-HDISWID,-HDISHIG,HDISWID,HDISHIG);
IF HDISHIG*HDISWID>1 THEN GETDDF("DD.TMP[TMP,HPM]");
DRKEN; RECTAN(PX-1,PY-1,PX+1,PY+1);
VIDEO(LXB←PX-SX,LYB←PY-SY,UXB←PX+SX,UYB←PY+SY,PIC[0],-2);
CHN←GDDCHN(-1);
ERASE(CHN);
FOR J←1,1,1,1,1,1 DO DPYUP(CHN);
OUTSTR(" CHANNEL "&CVOS(CHN)&'15&'12);
SHOW(CHN);
HAFTONE←TRUE;
IF HDISHIG*HDISWID>1 THEN PUTDDF("DD.TMP[TMP,HPM]");
HAPOS←HAPOS+1;
OUTSTR("*");
DO BACKLOG←INCHRW UNTIL BACKLOG≠'15∧BACKLOG≠'12;
SHOW(-1);
RDDCHN(CHN);
END
ELSE
IF CHR="R" THEN comment random halftone;
BEGIN
INTEGER J,CHN;
REAL SX,SY,ASP,ASPEN;
REAL PX,PY; INTEGER MODP;
SYNLAS←FALSE;
MODP←HAPOS MOD (HDISWID*HDISHIG);
PX←MODP MOD HDISWID;
MODP←MODP%HDISWID;
PY←HDISHIG-MODP-1;
PX←2*PX-HDISWID+1;
PY←2*PY-HDISHIG+1;
SX←1; SY←1; ASPEN←HASPECT*HDISWID/HDISHIG;
ASP←PIC[PCLN]/PIC[LNBY];
IF ASP>ASPEN THEN SX←ASPEN/ASP ELSE SY←ASP/ASPEN;
SX←SX*HSIZE; SY←SY*HSIZE;
SCREEN(-HDISWID,-HDISHIG,HDISWID,HDISHIG);
IF HDISHIG*HDISWID>1 THEN GETDDF("DD.TMP[TMP,HPM]");
DRKEN; RECTAN(PX-1,PY-1,PX+1,PY+1);
VID(LXB←PX-SX,LYB←PY-SY,UXB←PX+SX,UYB←PY+SY,PIC[0],-1);
CHN←GDDCHN(-1);
OUTSTR(" CHANNEL "&CVOS(CHN)&'15&'12);
ERASE(CHN);
FOR J←1,1,1,1,1,1 DO DPYUP(CHN);
SHOW(CHN);
HAFTONE←TRUE;
IF HDISHIG*HDISWID>1 THEN PUTDDF("DD.TMP[TMP,HPM]");
HAPOS←HAPOS+1;
OUTSTR("*");
DO BACKLOG←INCHRW UNTIL BACKLOG≠'15∧BACKLOG≠'12;
SHOW(-1);
RDDCHN(CHN);
END
ELSE
IF CHR="A" THEN comment arty bug halftone;
BEGIN
INTEGER J,CHN;
REAL SX,SY,ASP,ASPEN;
REAL PX,PY; INTEGER MODP;
SYNLAS←FALSE;
MODP←HAPOS MOD (HDISWID*HDISHIG);
PX←MODP MOD HDISWID;
MODP←MODP%HDISWID;
PY←HDISHIG-MODP-1;
PX←2*PX-HDISWID+1;
PY←2*PY-HDISHIG+1;
SX←1; SY←1; ASPEN←HASPECT*HDISWID/HDISHIG;
ASP←PIC[PCLN]/PIC[LNBY];
IF ASP>ASPEN THEN SX←ASPEN/ASP ELSE SY←ASP/ASPEN;
SX←SX*HSIZE; SY←SY*HSIZE;
SCREEN(-HDISWID,-HDISHIG,HDISWID,HDISHIG);
IF HDISHIG*HDISWID>1 THEN GETDDF("DD.TMP[TMP,HPM]");
DRKEN; RECTAN(PX-1,PY-1,PX+1,PY+1);
VIDEO(LXB←PX-SX,LYB←PY-SY,UXB←PX+SX,UYB←PY+SY,PIC[0],-4);
CHN←GDDCHN(-1);
ERASE(CHN);
FOR J←1,1,1,1,1,1 DO DPYUP(CHN);
OUTSTR(" CHANNEL "&CVOS(CHN)&'15&'12);
SHOW(CHN);
HAFTONE←TRUE;
IF HDISHIG*HDISWID>1 THEN PUTDDF("DD.TMP[TMP,HPM]");
HAPOS←HAPOS+1;
OUTSTR("*");
DO BACKLOG←INCHRW UNTIL BACKLOG≠'15∧BACKLOG≠'12;
SHOW(-1);
RDDCHN(CHN);
END
ELSE
IF CHR="X" THEN comment send previous halftone to the XGP;
BEGIN
INTEGER J;
OUTSTR("SIZE (-5 to +5):");
J←CVD(INCHWL);
IF J≠0 THEN
BEGIN
IF HAFTONE THEN BEGIN INVEN; RECTAN(-1000,-1000,1000,1000); END;
XGPUP(J);
IF HAFTONE THEN BEGIN INVEN; RECTAN(-1000,-1000,1000,1000); END;
END
ELSE
OUTSTR("aborted"&'15&'12);
END
ELSE
IF CHR="#" THEN comment switch a video switch output;
BEGIN
INTEGER J,K;
OUTSTR(" LINE:"); J←CVO(INCHWL);
OUTSTR("CHANNEL:"); K←CVO(INCHWL);
SHOW(K,J);
END
ELSE
IF CHR="P" THEN comment list a picture on the tty;
BEGIN
INTEGER I,J,K,L,M;
REAL ASP;
INTEGER SX,SY;
ASP←PIC[PCLN]/PIC[LNBY];
SX←TWID; SY←SX*ASP*TASPECT;
IF SY>TLEN THEN BEGIN SX←SX*TLEN/SY; SY←TLEN; END;
BEGIN
REAL ARRAY TMP[-1:SY,-1:SX];
REAL PCMAX;
PCMAX←2↑PIC[BYBI]-1;
FOR I←0 STEP 1 UNTIL SX-1 DO
FOR J←0 STEP 1 UNTIL SY-1 DO
TMP[J,I]←PIXEL(PIC[0],PIC[PCLN]*J%SY,PIC[LNBY]*I%SX)/PCMAX;
CALL(0,"RESET");
OUTSTR('15&'12);
FOR J←0 STEP 1 UNTIL SY-1 DO
BEGIN
FOR I←0 STEP 1 UNTIL SX-1 DO
BEGIN
REAL ERR;
IF (ERR←TMP[J,I])<0.5 THEN OUTSTR("*") ELSE
BEGIN
OUTSTR(" ");
ERR←ERR-1;
END;
ERR←ERR/16;
TMP[J+1,I-1]←TMP[J+1,I-1]+3*ERR;
TMP[J+1,I]←TMP[J+1,I]+5*ERR;
TMP[J+1,I+1]←TMP[J+1,I+1]+ERR;
TMP[J,I+1]←TMP[J,I+1]+7*ERR;
END;
OUTSTR('15&'12);
END;
END;
END
ELSE
IF CHR="∂" THEN comment add a letter to a font;
BEGIN
INTEGER LETR; STRING FOFIL;
OUTSTR("FONT FILE:"); FOFIL←INCHWL;
OUTSTR("LETTER:"); LETR←INCHWL;
DDFONT(LXB,LYB,UXB,UYB, FOFIL, LETR);
END
ELSE
IF CHR="λ" THEN comment make an XGPable file;
BEGIN
INTEGER I,J,K,L,M; REAL D,G,O; STRING S;
OPEN(1,"DSK",0,0,3,0,0,M);
M←0;
DO
BEGIN
OUTSTR("OUTPUT XGP FILE NAME:");
ENTER(1,INCHWL,M);
END
UNTIL ¬M;
OUTSTR("DENSITY (0 (normal) to 1):"); D←REALSCAN(S←INCHWL,M);
O←'77+'40*D; G←(D+1)*'40/2↑PIC[BYBI];
FOR I←0 STEP 1 UNTIL PIC[PCLN]-1 DO
BEGIN
FOR J←0 STEP 1 UNTIL PIC[LNBY]-1 DO
OUT(1,M←O-G*PIXEL(PIC[0],I,J));
OUT(1,'15&'12);
END;
CLOSE(1);
END
ELSE
IF CHR="C" THEN comment step past a certain number of pictures;
BEGIN
INTEGER T;
OUTSTR("SKIP HOW MANY (NEGATIVE TO BACKSPACE):");
T←CVD(INCHWL);
IF SYNLAS THEN SYPOS←SYPOS+T ELSE HAPOS←HAPOS+T;
END
ELSE
IF CHR="K" THEN comment clear the video synthesizer;
BEGIN
INTEGER T;
FOR T←0 STEP 1 UNTIL 7 DO ERASE(SYNMAP(T));
OUTSTR('15&'12);
END
ELSE
IF CHR="*" THEN comment gronk synthesizer intensity table;
BEGIN
STRING SI; INTEGER I;
OUTSTR("TRANSFER FUNCTION (about -2.0 to 2.0):");
IF ¬MAPGRY(MAPTF←REALSCAN(SI←INCHWL,I),MAPBT) THEN
OUTSTR("sorry, ELF not available"&'15&'12);
END
ELSE
IF CHR="S" THEN comment change size of displays;
BEGIN
STRING INP; INTEGER FOO,INC;
REAL T;
OUTSTR('15&'12&"FOR SYNTHESIZER, HALFTONES OR PRINTOUT (S, H OR P)?");
INC←UCONV(INCHWL);
IF INC="S" THEN
BEGIN
INTEGER I;
SYNLAS←TRUE;
SETFORMAT(0,2);
OUTSTR("PICTURE SIZE (1 IS FULLSIZE, NOW"&CVF(SSIZE)&"):"); INP←INCHWL;
T←REALSCAN(INP,FOO);
IF T≠0 THEN SSIZE←ABS(T);
OUTSTR("ASPECT RATIO (HEIGHT/WIDTH OF SCREEN, NOW"&CVF(SASPECT)&"):");
INP←INCHWL;
T←REALSCAN(INP,FOO);
IF T>0 THEN SASPECT←T;
OUTSTR("NUMBER OF PICTURES IN X DIRECTION:");
T←ABS(CVD(INCHWL));
IF T>0∧T≠SDISWID THEN
BEGIN
SDISWID←T;
SYPOS←0;
END;
OUTSTR("NUMBER OF PICTURES IN Y DIRECTION:");
T←ABS(CVD(INCHWL));
IF T>0∧T≠SDISHIG THEN
BEGIN
SDISHIG←T;
SYPOS←0;
END;
SCREEN(-1,-1,1,1);
DRKEN; RECTAN(-1000,-1000,1000,1000);
IF SDISHIG*SDISWID>1 THEN
BEGIN
OUTSTR("ERASE?");
IF UCONV(INCHWL)="Y" THEN
FOR I←0 STEP 1 UNTIL 7 DO
PUTDDF("DD"&CVS(I)&".TMP[TMP,HPM]")
ELSE
BEGIN
OUTSTR("REDRAW OLD DISPLAY NOW?");
IF UCONV(INCHWL)="Y" THEN
FOR I←7 STEP -1 UNTIL 0 DO
IF SYNMAP(I)≥0 THEN
BEGIN
IF I=0 THEN MAPGRY(MAPTF,MAPBT);
SHOWA('47);
GETDDF("DD"&CVS(I)&".TMP[TMP,HPM]");
ERASE(SYNMAP(I));
DPYUP(SYNMAP(I)); DPYUP(SYNMAP(I));
DPYUP(SYNMAP(I)); DPYUP(SYNMAP(I));
SHOWA('47);
END;
HAFTONE←TRUE;
OUTSTR("*");
DO BACKLOG←INCHRW UNTIL BACKLOG≠'15∧BACKLOG≠'12;
END;
END;
END
ELSE IF INC="H" THEN
BEGIN
SYNLAS←FALSE;
SETFORMAT(0,2);
OUTSTR("PICTURE SIZE (1 IS FULLSIZE, NOW"&CVF(HSIZE)&"):"); INP←INCHWL;
T←REALSCAN(INP,FOO);
IF T≠0 THEN HSIZE←ABS(T);
OUTSTR("ASPECT RATIO (HEIGHT/WIDTH OF SCREEN, NOW"&CVF(HASPECT)&"):");
INP←INCHWL;
T←REALSCAN(INP,FOO);
IF T>0 THEN HASPECT←T;
OUTSTR("NUMBER OF PICTURES IN X DIRECTION:");
T←ABS(CVD(INCHWL));
IF T>0∧T≠HDISWID THEN
BEGIN
HDISWID←T;
HAPOS←0;
END;
OUTSTR("NUMBER OF PICTURES IN Y DIRECTION:");
T←ABS(CVD(INCHWL));
IF T>0∧T≠HDISHIG THEN
BEGIN
HDISHIG←T;
HAPOS←0;
END;
SCREEN(-1,-1,1,1);
DRKEN; RECTAN(-1000,-1000,1000,1000);
IF HDISHIG*HDISWID>1 THEN PUTDDF("DD.TMP[TMP,HPM]");
END
ELSE IF INC="P" THEN
BEGIN
SETFORMAT(0,2);
OUTSTR("ASPECT RATIO OF TTY (CHRS/IN, VERTICAL/HORIZONTAL, NOW "&
CVF(TASPECT)&"):");
INP←INCHWL;
T←REALSCAN(INP,FOO);
IF T≠0 THEN TASPECT←ABS(T);
OUTSTR("WIDTH OF TTY DISPLAYS (NOW "&CVS(TWID)&"):");
INP←INCHWL;
T←REALSCAN(INP,FOO);
IF T≠0 THEN TWID←ABS(T);
OUTSTR("MAXIMUM HEIGHT OF TTY DISPLAYS (NOW "&CVS(TLEN)&"):");
INP←INCHWL;
T←REALSCAN(INP,FOO);
IF T≠0 THEN TLEN←ABS(T);
END;
END
ELSE
IF CHR="F" THEN comment high pass filter;
BEGIN
INTEGER WINDOW;
OUTSTR(" WINDOW SIZE:");
WINDOW←CVD(INCHWL);
IF WINDOW>1 THEN
BEGIN
INTEGER ARRAY T[0:PHAVE];
PASSHI(PIC[0],WINDOW,T[0]);
ENHANCE(T[0]);
COPPIC(T[0],PIC[0]);
END
ELSE OUTSTR("aborted"&'15&'12);
END
ELSE
IF CHR="L" THEN comment low pass filter;
BEGIN
INTEGER ARRAY T[0:PHAVE];
IF PIC[PCLN]≥2∧PIC[LNBY]≥2 THEN
BEGIN
HAFPIC(PIC[0],T[0],8);
COPPIC(T[0],PIC[0]);
END;
PWANT←PHAVE←PIXDIM(PIC[PCLN],PIC[LNBY],PIC[BYBI]);
INITED←FALSE;
OUTSTR('15&'12);
OUTSTR(CVS(PIC[PCLN])&" LINES x "&CVS(PIC[LNBY])&
" BYTES/LINE x "&CVS(PIC[BYBI])&" BITS/BYTE"&'15&'12);
END
ELSE
IF CHR="W" THEN comment select a window;
BEGIN
INTEGER XL,XH,YL,YH,FOO; REAL A,B;
STRING INFL;
OUTSTR('15&'12);
OUTSTR("LOW X, HIGH X (PIXELS OR FRACTION):"); INFL←INCHWL;
XL←A←REALSCAN(INFL,FOO);
XH←B←REALSCAN(INFL,FOO);
IF ABS(A)≤1 ∧ ABS(B)≤1 THEN
BEGIN
XL←A*PIC[LNBY];
XH←B*PIC[LNBY];
END;
IF XL>XH THEN XL↔XH;
XL←XL MAX 0; XH←XH MIN (PIC[LNBY]-1);
IF (XH-XL+1)>0 THEN
BEGIN
OUTSTR("LOW Y, HIGH Y:"); INFL←INCHWL;
YL←A←REALSCAN(INFL,FOO);
YH←B←REALSCAN(INFL,FOO);
IF ABS(A)≤1 ∧ ABS(B)≤1 THEN
BEGIN
YL←A*PIC[PCLN];
YH←B*PIC[PCLN];
END;
IF YL>YH THEN YL↔YH;
YL←YL MAX 0; YH←YH MIN (PIC[PCLN]-1);
IF (YH-YL+1)>0 THEN
BEGIN
INTEGER ARRAY T[0:PIXDIM(YH-YL+1,XH-XL+1,PIC[BYBI])];
MAKPIX(YH-YL+1,XH-XL+1,PIC[BYBI],T[0]);
SELECT(PIC[0],YL,XL,T[0]);
COPPIC(T[0],PIC[0]);
OUTSTR(CVS(PIC[PCLN])&" LINES x "&CVS(PIC[LNBY])&
" BYTES/LINE x "&CVS(PIC[BYBI])&" BITS/BYTE"&'15&'12);
PWANT←PHAVE←PIXDIM(PIC[PCLN],PIC[LNBY],PIC[BYBI]);
INITED←FALSE;
END;
END;
END
ELSE
IF CHR="Z" THEN comment change size of a picture;
BEGIN
INTEGER FOO;
STRING INFL;
IF LENGTH(BACKLOG)=0 THEN
BEGIN
OUTSTR('15&'12);
OUTSTR("DILATION FACTORS (EG. .5 = HALF SIZE) X, Y:"); INFL←INCHWL;
WID←ABS(REALSCAN(INFL,FOO))*PIC[LNBY]; IF WID=0 THEN WID←PIC[LNBY];
HIG←ABS(REALSCAN(INFL,FOO))*PIC[PCLN]; IF HIG=0 THEN HIG←PIC[PCLN];
OUTSTR("NUMBER OF BITS:"); BITS←(CVD(INCHWL) MIN 36);
IF BITS≤0 THEN BITS←PIC[BYBI];
IF BITS≠PIC[BYBI]∨WID≠PIC[LNBY]∨HIG≠PIC[PCLN] THEN
BEGIN
PUTPFL(PIC[0],"TMP.TMP[TMP,HPM]");
PWANT←PIXDIM(HIG,WID,BITS);
BACKLOG←"Z ";
END;
END
ELSE
BEGIN
INTEGER ARRAY T[0:PFLDIM("TMP.TMP[TMP,HPM]")];
GETPFL("TMP.TMP[TMP,HPM]",T[0]);
MAKPIX(HIG,WID,BITS,PIC[0]);
OUTSTR(CVS(PIC[PCLN])&" LINES x "&CVS(PIC[LNBY])&
" BYTES/LINE x "&CVS(PIC[BYBI])&" BITS/BYTE"&'15&'12);
SHRINK(T[0],PIC[0]);
BACKLOG←"";
INITED←FALSE;
END;
END
ELSE
IF CHR="U" THEN comment remove blank border from a picture;
BEGIN
INTEGER ARRAY ROW[0:PIC[PCLN]-1],COL[0:PIC[LNBY]-1];
INTEGER FHX,FHY,I,K,FLX,FLY;
ROWSUM(PIC[0],ROW[0]);
K←0; FOR I←0 STEP 1 UNTIL PIC[PCLN]-1 DO K←K+ROW[I];
K←K/PIC[PCLN]; FLY←0; WHILE ROW[FLY]<K/2 DO FLY←FLY+1;
FHY←PIC[PCLN]-1; WHILE ROW[FHY]<K/2 DO FHY←FHY-1;
IF ROW[FLY]<K/1.5 THEN FLY←FLY+1;
IF ROW[FLY]<K/1.5 THEN FLY←FLY+1;
COLSUM(PIC[0],COL[0]);
K←0; FOR I←0 STEP 1 UNTIL PIC[LNBY]-1 DO K←K+COL[I];
K←K/PIC[LNBY]; FLX←0; WHILE COL[FLX]<K/2 DO FLX←FLX+1;
FHX←PIC[LNBY]-1; WHILE COL[FHX]<K/2 DO FHX←FHX-1;
WID←FHX-FLX+1; HIG←FHY-FLY+1;
IF BITS≠PIC[BYBI]∨WID≠PIC[LNBY]∨HIG≠PIC[PCLN] THEN
BEGIN
INTEGER ARRAY T[0:PHAVE];
COPPIC(PIC[0],T[0]);
MAKPIX(HIG,WID,BITS,PIC[0]);
SELECT(T[0],FLY,FLX,PIC[0]);
OUTSTR(CVS(PIC[PCLN])&" LINES x "&CVS(PIC[LNBY])&
" BYTES/LINE x "&CVS(PIC[BYBI])&" BITS/BYTE"&'15&'12);
PHAVE←PWANT←PIXDIM(HIG,WID,BITS);
INITED←FALSE;
END;
END
ELSE
IF CHR="N" THEN comment apply noise remover;
BEGIN
CLEAN(PIC[0]);
OUTSTR('15&'12);
END
ELSE
IF CHR="V" THEN comment apply interest operator;
BEGIN
INTEGER WINDOW;
OUTSTR(" WINDOW SIZE:"); WINDOW←CVD(INCHWL);
IF WINDOW≥1 THEN
BEGIN
INTEREST(PIC[0],WINDOW,PIC[0]);
OUTSTR(CVS(PIC[PCLN])&" LINES x "&CVS(PIC[LNBY])&
" BYTES/LINE x "&CVS(PIC[BYBI])&" BITS/BYTE"&'15&'12);
PWANT←PHAVE←PIXDIM(PIC[PCLN],PIC[LNBY],PIC[BYBI]);
INITED←FALSE;
END
ELSE OUTSTR("aborted"&'15&'12);
END
ELSE
IF CHR="M" THEN comment pixel modification;
BEGIN
PRELOAD_WITH -1;
OWN INTEGER ARRAY PERM[-1:1024];
STRING INP; INTEGER FOO,I,J;
INTEGER LAST,THIS;
IF PERM[-1]=PIC[BYBI] THEN
BEGIN
OUTSTR(" ENTER NEW TRANSFORM?");
INP←UCONV(INCHRW);
END ELSE INP←"Y";
OUTSTR('15&'12);
IF INP="Y" THEN
BEGIN
PERM[-1]←PIC[BYBI];
OUTSTR(CVS(2↑PIC[BYBI])&" TOTAL GREY LEVELS, ENTER HOW MANY:");
FOO←(CVD(INCHWL) MAX 2) MIN 2↑PIC[BYBI];
LAST←0;
FOR I←0 STEP 1 UNTIL FOO-1 DO
BEGIN
THIS←((1 ASH PIC[BYBI])-1)*I%(FOO-1);
OUTSTR(CVS(THIS)&"→");
PERM[THIS]←CVD(INCHWL);
IF THIS>LAST THEN
FOR J←LAST STEP 1 UNTIL THIS DO
PERM[J]←(PERM[LAST]*(THIS-J)+PERM[THIS]*(J-LAST))%(THIS-LAST);
LAST←THIS;
END;
FOR I←0 STEP 1 UNTIL 2↑PIC[BYBI]-1 DO
PERM[I]←(PERM[I] MAX 0) MIN (2↑PIC[BYBI]-1);
END;
PERBIT(PIC[0],PERM[0]);
END
ELSE
IF CHR="G" THEN comment graph a histogram;
BEGIN
INTEGER ARRAY HIST[0:2↑PIC[BYBI]];
INTEGER FOO,I,J,MAV,CHN;
CHN←GDDCHN(-1);
OUTSTR(" CHANNEL "&CVOS(CHN)&'15&'12);
FOO←2↑PIC[BYBI]-1;
HISTOG(PIC[0],HIST[0]);
SCREEN(-.3,-.2,1.1,1.2);
DRKEN; RECTAN(-100,-100,100,100);
LITEN;
LINE(0,0,0,1); LINE(0,1,1,1);
LINE(1,1,1,0); LINE(1,0,0,0);
LINE(0,.5,1,.5); LINE(0,.25,1,.25); LINE(0,.75,1,.75);
LINE(.5,0,.5,1); LINE(.25,0,.25,1); LINE(.75,0,.75,1);
MAV←0; FOR I←0 STEP 1 UNTIL FOO DO MAV←MAV MAX HIST[I];
MAV←MAV+1;
FOR I←1 STEP 1 UNTIL FOO DO
LINE((I-1)/FOO,HIST[I-1]/MAV,I/FOO,HIST[I]/MAV);
TXTPOS(0,-1/10,1/24,1/12); TEXT("0");
TXTPOS(1-LENGTH(CVS(2↑PIC[BYBI]))/24,-1/10,1/24,1/12);
TEXT(CVS(2↑PIC[BYBI]-1));
TXTPOS(-.07,0,1/24,1/12); TEXT("0");
TXTPOS(-.07-(LENGTH(CVS(MAV))-1)/24,1-1/12,1/24,1/12); TEXT(CVS(MAV));
ERASE(CHN);
FOR J←1,1,1,1,1 DO DPYUP(CHN);
HAFTONE←FALSE; LXB←LYB←-1; UXB←UYB←1;
SHOW(CHN);
OUTSTR("*");
DO BACKLOG←INCHRW UNTIL BACKLOG≠'15∧BACKLOG≠'12;
RDDCHN(CHN);
SHOW(-1);
END
ELSE
IF CHR="J" THEN comment graph a histogram;
BEGIN
INTEGER ARRAY HIST[0:2↑PIC[BYBI]];
INTEGER FOO,I,J,L,MAV,CHN;
CHN←GDDCHN(-1);
OUTSTR(" CHANNEL "&CVOS(CHN)&'15&'12);
FOO←2↑PIC[BYBI]-1;
HISTOG(PIC[0],HIST[0]);
SCREEN(-.3,-.2,1.1,1.2);
DRKEN; RECTAN(-100,-1000,1000,1000);
LITEN;
LINE(0,0,0,1); LINE(0,1,1,1);
LINE(1,1,1,0); LINE(1,0,0,0);
LINE(0,.5,1,.5); LINE(0,.25,1,.25); LINE(0,.75,1,.75);
LINE(.5,0,.5,1); LINE(.25,0,.25,1); LINE(.75,0,.75,1);
MAV←0; FOR I←0 STEP 1 UNTIL FOO DO MAV←MAV + HIST[I];
L←J←0;
FOR I←1 STEP 1 UNTIL FOO DO
BEGIN
L←J;
J←J+HIST[I];
LINE((I-1)/FOO,L/MAV,I/FOO,J/MAV);
END;
TXTPOS(0,-1/10,1/24,1/12); TEXT("0");
TXTPOS(1-LENGTH(CVS(2↑PIC[BYBI]))/24,-1/10,1/24,1/12);
TEXT(CVS(2↑PIC[BYBI]-1));
TXTPOS(-.07,0,1/24,1/12); TEXT("0");
TXTPOS(-.07-(LENGTH(CVS(MAV))-1)/24,1-1/12,1/24,1/12); TEXT(CVS(MAV));
ERASE(CHN);
FOR J←1,1,1,1,1 DO DPYUP(CHN);
SHOW(CHN);
HAFTONE←FALSE; LXB←LYB←-1; UXB←UYB←1;
OUTSTR("*");
DO BACKLOG←INCHRW UNTIL BACKLOG≠'15∧BACKLOG≠'12;
RDDCHN(CHN);
SHOW(-1);
END
ELSE
IF CHR="E" THEN comment apply histogram normalizer;
BEGIN
ENHANCE(PIC[0]);
OUTSTR('15&'12);
END
ELSE
IF CHR="Y" THEN comment apply vert sync loss correction;
BEGIN
SYNCHRONIZE(PIC[0]);
OUTSTR('15&'12);
END
ELSE
IF CHR="Q" THEN comment exit;
BEGIN
if outddcalled then OUTDD('40&'15&'12);
CALL(0,"EXIT");
END
ELSE
BEGIN comment an unrecognized character;
IF CHR='12 THEN OUTSTR('15) ELSE
OUTSTR("?"&'15&'12);
END;
END;
PHAVE←PWANT;
END;
END "PIX";